package dstree

// 支持操作
// Insert（S，x）
// MaxiNum（S）返回具有最大关键字的元素
// ExtractMax(S) 去掉并返回最大
// IncreaseKey(S,x,k) 将元素x的关键字的值增加到k

type PqItemSeries []Query_result

func (pq PqItemSeries) Len() int {
	return len(pq)
}

// 小根堆
func (pq PqItemSeries) Less(i int, j int) bool {
	return pq[i].Distance < pq[j].Distance
}

func (pq PqItemSeries) Swap(i int, j int) {
	pq[i], pq[j] = pq[j], pq[i]
	pq[i].PQueue_position = i
	pq[j].PQueue_position = j
}

func (pq *PqItemSeries) Push(x any) {
	n := len(*pq)
	item := x.(Query_result)
	item.PQueue_position = n
	*pq = append(*pq, item)
}

func (pq *PqItemSeries) Pop() any {
	old := *pq
	n := len(old)
	x := old[n-1]
	x.PQueue_position = -1
	*pq = old[0 : n-1]
	return x
}

func (pq *PqItemSeries) Insert_Sort_results(result Query_result) {
	old := *pq
	n := len(old)
	for i := 0; i < n; i++ {
		if result.Distance < old[i].Distance {
			copy(old[i+1:], old[i:])
			old[i] = result
			break
		}
	}
}

// func (pq PqItemSeries) Print_Results() {
// 	n := pq.Len()
// 	for i := 0; i < n; i++ {
// 		PrintQueryResult(&pq[i])
// 	}
// }

// Fix比重新建堆代价小，从更新节点处完成adjust
// 若堆发生了调整,此时以节点为根的树已经是堆，说明是往下调整不需要动其他节点
// 如果堆没有发生调整即要往上检查
// 就从节点处往上进行调整——大元素上升
// func (pq *PqItemSeries) update(item *Query_result, value string, priority int) {
// 	item.value = value
// 	item.priority = priority
// 	heap.Fix(pq, item.index)
// }
